<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
    <script src="element-ui/lib/index.js"></script>
    <script src="js/axios-0.18.0.js"></script>
    <link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css">
    <style>
        .el-table .warning-row {
            background: oldlace;
        }

        .el-table .success-row {
            background: #f0f9eb;
        }
    </style>
</head>
<body>
<div id="app">
    <!--搜索表单-->
    <el-form :inline="true" :model="brand" class="demo-form-inline">
        <el-form-item label="当前状态">
            <el-select v-model="brand.status" placeholder="当前状态">
                <el-option label="启用" value="1"></el-option>
                <el-option label="禁用" value="0"></el-option>
            </el-select>
        </el-form-item>

        <el-form-item label="企业名称">
            <el-input v-model="brand.companyName" placeholder="企业名称"></el-input>
        </el-form-item>

        <el-form-item label="品牌名称">
            <el-input v-model="brand.brandName" placeholder="品牌名称"></el-input>
        </el-form-item>

        <el-form-item>
            <el-button type="primary" @click="onSubmit">查询</el-button>
        </el-form-item>

    </el-form>

    <!--按钮-->
    <el-row>
        <el-button type="danger" plain>批量删除</el-button>
        <!--这个按钮绑定了单击事件，而该事件触发后，将dialogFormVisible模型数据的值置为true,对话框就出来了
        false就是隐藏-->
        <el-button type="primary" plain @click="dialogVisible = true">新增</el-button>
    </el-row>


    <!--添加数据对话框表单-->
    <el-dialog
            title="编辑品牌"
            :visible.sync="dialogVisible"
            width="30%">
        <el-form ref="form" :model="brand" label-width="80px">
            <el-form-item label="品牌名称">
                <el-input v-model="brand.brandName"></el-input>
            </el-form-item>

            <el-form-item label="企业名称">
                <el-input v-model="brand.companyName"></el-input>
            </el-form-item>

            <el-form-item label="排序">
                <el-input v-model="brand.ordered"></el-input>
            </el-form-item>

            <el-form-item label="备注">
                <el-input type="textarea" v-model="brand.description"></el-input>
            </el-form-item>

            <el-form-item label="状态">
                <el-switch v-model="brand.status"
                           active-value="1"
                           inactive-value="0"
                ></el-switch>
            </el-form-item>
            <el-form-item>
                <el-button type="primary" @click="addBrand">提交</el-button>
                <el-button @click="dialogVisible = false">取消</el-button>
            </el-form-item>
        </el-form>
    </el-dialog>

    <!--表格-->
    <template>
        <!--<el-table>标签上有一个事件 @selection-change="handleSelectionChange"-->
        <el-table
                :data="paginatedData"
                style="width: 100%"
                :row-class-name="tableRowClassName"
                @selection-change="handleSelectionChange"
        >
            <!--多选框-->
            <el-table-column
                    type="selection"
                    width="55"
            >
            </el-table-column>

            <!--序号-->
            <!--prop 是 Element UI 中的一个用于将表格列和数据属性绑定起来的属性。在 el-table-column 组件中，prop 指定了当前列要展示的数据字段，
            它自动从表格的数据源（即 el-table 的 :data 属性所绑定的数据）中获取相应的字段值并显示出来。-->
            <el-table-column
                    label="序号"
                    prop="id"
                    width="50"
            >
            </el-table-column>

            <!--prop绑定的数据模型,label表头上显示的列名,align使数据居中-->
            <!--表示一列,需要几列就需要使用几个该标签-->
            <el-table-column
                    prop="brandName"
                    label="品牌名称"
                    align="center"
            >
            </el-table-column>

            <el-table-column
                    prop="companyName"
                    label="企业名称"
                    align="center">
            </el-table-column>

            <el-table-column
                    prop="ordered"
                    label="排序"
                    align="center">
            </el-table-column>


            <el-table-column
                    prop="status"
                    label="当前状态"
                    align="center">
            </el-table-column>

            <el-table-column align="center" label="操作">

                <template v-slot="scope">
                    <el-button type="primary">修改</el-button>
                    <!--这行代码是正确的写法，尤其是在 el-table-column 的 slot-scope 语法中使用时。-->
                    <!--row 明确指的是当前行的数据对象。-->
                    <el-button type="danger" @click="confirmDeleteBrand(scope.row)">删除</el-button>
                </template>



            </el-table-column>

        </el-table>

        <!--分页工具条-->
        <!--设置layout，表示需要显示的内容，用逗号分隔，布局元素会依次显示。
        prev表示上一页，next为下一页，pager表示页码列表，除此以外还提供了jumper和total，sizes和特殊的布局符号->，
        ->后的元素会靠右显示，jumper表示跳页元素，total表示总条目数，sizes用于设置每页显示的页码数量。-->
        <!--
            size-change ：pageSize 改变时会触发。也就是当我们改变了每页显示的条目数后，该事件会触发。
            current-change ：currentPage 改变时会触发。也就是当我们点击了其他的页码后，该事件会触发。
            page-size：每页显示的条目数
            page-sizes:  个数选择器的选项设置,可以更改每页显示多少个数据
            currentPage: 当前页码，我们选择，点击哪个页码，该属性值就是几
            total:总记录数。用来设置总的数据条目数，该属性设置后， Element 会自动计算出需分多少页并给我们展示对应的页码。
        -->
        <el-pagination
                @size-change="handleSizeChange"
                @current-change="handleCurrentChange"
                :current-page="currentPage"
                :page-sizes="[5, 10, 15, 20]"
                :page-size="pageSize"
                layout="total, sizes, prev, pager, next, jumper"
                :total="totalItems">
        </el-pagination>
    </template>
</div>


<script>
    // methods 放置自定义方法，用于响应用户交互或处理逻辑，比如按钮点击事件、数据计算等。
    // mounted：属于生命周期钩子，用于在组件挂载到页面后立即执行操作，如与 DOM 交互、发起 API 请求等。
    // 它是在组件模板已经插入到页面后调用的，适合进行 DOM 操作。
    new Vue({
        el: "#app",
        // 模型数据
        data() {
            return {
                //当前页码
                currentPage: 1,
                //每页显示的条数
                pageSize: 10,
                //总条目数
                totalItems: 0,
                //添加数据对话框是否展示的标记
                dialogVisible: false,
                // 品牌模型数据
                brand: {
                    status: '',
                    brandName: '',
                    companyName: '',
                    id: "",
                    ordered: "",
                    description: ""
                },
                // 复选框选中数据集合
                multipleSelection: [],

                //表格数据
                tableData: [],
                // 用于显示的分页数据
                paginatedData: []
            }
        },
        // 方法
        methods: {
            tableRowClassName({row, rowIndex}) {
                if (rowIndex === 1) {
                    return 'warning-row';
                } else if (rowIndex === 3) {
                    return 'success-row';
                }
                return '';
            },
            //复选框选中后执行的方法
            handleSelectionChange(val) {
                this.multipleSelection = val;
                console.log(this.multipleSelection)
            },
            //查询方法
            onSubmit() {
                console.log(this.brand);
            },
            //添加数据
            //在此方法中需要发送异步请求并将表单中输入的数据作为参数进行传递
            addBrand() {
                //发送ajax请求，添加数据
                //let _this = this; 用来保存 this 指向 Vue 实例，以避免回调函数中的 this 指向发生变化。
                let _this = this;
                axios({
                    method: "post",
                    url: "http://localhost:8080/web_24_vue_element_case/addServlet",
                    data: _this.brand
                }).then(function (resp) {
                    //响应数据的处理逻辑
                    if (resp.data == "success") {
                        alert(_this.dialogVisible);
                        //添加成功
                        //1.关闭新增对话窗口
                        _this.dialogVisible = false;
                        //2.重新查询数据
                        _this.selectAll();
                        //弹出消息提示
                        //调用 Element UI 提供的全局消息方法
                        _this.$message({
                            message: "恭喜你，添加成功",
                            type: "success"
                        })
                    }
                })

            },
            selectAll() {
                let _this = this;
                axios({
                    method: "get",
                    url: "http://localhost:8080/web_24_vue_element_case/selectAllServlet"
                }).then(function (resp) {
                    _this.tableData = resp.data;
                    _this.totalItems = resp.data.length; //设置总条目数
                    _this.updatePaginatedData(); //更新分页数据
                })
            },
            //分页
            handleSizeChange(val) {
                this.pageSize = val;
                this.updatePaginatedData();
            },
            handleCurrentChange(val) {
                this.currentPage = val;
                this.updatePaginatedData();
            },
            updatePaginatedData() {
                const start = (this.currentPage - 1) * this.pageSize;
                const end = start + this.pageSize;
                this.paginatedData = this.tableData.slice(start, end);
            },
            confirmDeleteBrand(row){
                let _this = this;
                _this.$confirm('此操作将永久删除该品牌, 是否继续?', '提示',{
                    confirmButtonText: '确认',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(()=>{
                    //用户确认删除后执行操作
                    _this.deleteBrand(row);
                }).catch(()=>{
                    //用户取消操作时
                    //1.用户点击删除按钮后，会弹出一个确认对话框 (this.$confirm 方法)。
                    //2.如果用户点击 “确认” 按钮，执行 .then() 回调函数中的代码，调用 deleteBrand(row) 来进行删除操作。
                    //3.如果用户点击 “取消” 按钮，或者关闭弹窗，不继续删除操作，就会进入 .catch() 回调函数，执行其中的代码，显示取消删除的提示消息。
                    _this.$message({
                        type: 'info',
                        message: '已取消删除'
                    });
                })
            },
            deleteBrand(row) {
                let _this = this;
                // 获取品牌的唯一ID
                const brandId = row.id;
                // 根据id发送axios请求
                axios({
                    method: "get",
                    url: `http://localhost:8080/web_24_vue_element_case/deleteByIdServlet?brandId=${brandId}`
                }).then(function (resp) {
                    if (resp.data == "success") {
                        //删除成功后，重新查询数据，并更新表格
                        _this.selectAll();
                        _this.$message({
                            message: "品牌删除成功",
                            type: "success"
                        });
                    } else {
                        _this.$message({
                            message: "删除失败",
                            type: "error"
                        });
                    }
                });
            }
        },
        //挂载方法
        mounted() {
            this.selectAll();
        }
    })
</script>
</body>
</html>